home *** CD-ROM | disk | FTP | other *** search
- import java.io.BufferedInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.Date;
-
- public class SearchDocument {
- private static final String[] months = new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
- private BufferedInputStream bis;
- private volatile boolean interruptSearch;
- private boolean gotDocumentInfo;
- private boolean gotTitle;
- private volatile boolean noHorribleError = false;
- private URL url;
- private String relativeURL;
- private String title;
- private String documentInfo;
- private String contextString;
- private String nearestAnchor;
- private int leadingContextLength;
- private int trailingContextLength;
- private SearchSieve titleFinder = new SearchSieve("<title>", false);
- private SearchSieve anchorFinder = new SearchSieve("<a name=", false);
- private String stopPattern;
- private boolean useStopPattern = false;
- private String startPattern;
- private boolean useStartPattern = false;
-
- public SearchDocument(URL var1, String var2, int var3, int var4) throws MalformedURLException {
- this.url = buildURL(var1, var2);
- this.noHorribleError = true;
- this.gotDocumentInfo = false;
- this.gotTitle = false;
- this.title = "";
- this.documentInfo = "";
- this.relativeURL = var2;
- this.interruptSearch = false;
- this.contextString = null;
- if (var3 < 0) {
- throw new IllegalArgumentException("leadingContextLength < 0");
- } else {
- this.leadingContextLength = var3;
- if (var4 < 0) {
- throw new IllegalArgumentException("trailingContextLength < 0");
- } else {
- this.trailingContextLength = var4;
- }
- }
- }
-
- private static final URL buildURL(URL var0, String var1) throws MalformedURLException {
- Object var2 = null;
- int var3 = var1.length();
- URL var8;
- if (var1.startsWith("../")) {
- int var4 = 3;
- String var5 = var0.getFile();
- int var6 = var5.lastIndexOf(47);
- if (var6 != -1) {
- var6 = var5.lastIndexOf(47, var6 - 1);
- }
-
- while(var1.startsWith("../", var4)) {
- var6 = var5.lastIndexOf(47, var6 - 1);
- var4 += 3;
- if (var6 == -1) {
- throw new MalformedURLException("Higher than root: " + var0.toString() + " + " + var1);
- }
- }
-
- if (var4 != var3) {
- var1 = var1.substring(var4, var3);
- } else {
- var1 = "";
- }
-
- if (var6 != -1) {
- var5 = var5.substring(0, var6 + 1);
- if (var4 != var3) {
- var5 = var5 + var1;
- }
- } else {
- var5 = "/" + var1;
- }
-
- var8 = new URL(var0.getProtocol(), var0.getHost(), var5);
- } else if (var1.startsWith("/")) {
- var8 = new URL(var0.getProtocol(), var0.getHost(), var1);
- } else if (var1.startsWith("./")) {
- var8 = new URL(var0, var1.substring(2, var3));
- } else if (var1.startsWith("?")) {
- var8 = new URL(var0.getProtocol(), var0.getHost(), var0.getFile() + var1);
- } else {
- var8 = new URL(var0, var1);
- }
-
- return var8;
- }
-
- public String getDocumentTitle() {
- return this.title;
- }
-
- public String getDocumentInfo() {
- return this.documentInfo;
- }
-
- public String getRelativeURL() {
- return this.relativeURL;
- }
-
- public String getNearestAnchor() {
- return this.nearestAnchor;
- }
-
- public final String getContext() {
- return this.contextString;
- }
-
- public final boolean isErrored() {
- return !this.noHorribleError;
- }
-
- public void setStartPattern(String var1) {
- if (var1 == null) {
- throw new NullPointerException("null pattern");
- } else {
- this.startPattern = var1;
- this.useStartPattern = true;
- }
- }
-
- public String getStartPattern() {
- return this.startPattern;
- }
-
- public void stopUsingStartPattern() {
- this.useStartPattern = false;
- }
-
- public boolean isUsingStartPattern() {
- return this.useStartPattern;
- }
-
- public void setStopPattern(String var1) {
- if (var1 == null) {
- throw new NullPointerException("null pattern");
- } else {
- this.stopPattern = var1;
- this.useStopPattern = true;
- }
- }
-
- public String getStopPattern() {
- return this.stopPattern;
- }
-
- public void stopUsingStopPattern() {
- this.useStopPattern = false;
- }
-
- public boolean isUsingStopPattern() {
- return this.useStopPattern;
- }
-
- public final synchronized boolean searchFor(String[] var1, boolean var2, boolean var3, boolean var4) throws InterruptedException {
- this.contextString = null;
- this.nearestAnchor = null;
- if (!this.noHorribleError) {
- return false;
- } else {
- boolean var5 = false;
- boolean var9 = false;
- boolean var10 = false;
- boolean var11 = false;
- SearchSieve var12 = null;
- boolean var13 = false;
- SearchSieve var14 = null;
- boolean var15 = true;
- Object var16 = null;
- StringBuffer var17 = new StringBuffer();
- StringBuffer var18 = null;
- this.anchorFinder.reset();
- int var19 = var1.length;
- SearchSieve[] var20 = new SearchSieve[var19];
-
- for(int var21 = 0; var21 < var19; ++var21) {
- var20[var21] = new SearchSieve(var1[var21].toLowerCase(), var2);
- }
-
- if (this.useStopPattern) {
- var12 = new SearchSieve(this.stopPattern, false);
- }
-
- if (this.useStartPattern) {
- var15 = false;
- var14 = new SearchSieve(this.startPattern, false);
- }
-
- if (!this.gotTitle) {
- this.titleFinder.reset();
- var18 = new StringBuffer();
- }
-
- if (!this.openConnection()) {
- return false;
- } else {
- CircularStringBuffer var31;
- if (var2) {
- var31 = new CircularStringBuffer(this.leadingContextLength + 1);
- } else {
- var31 = new CircularStringBuffer(this.leadingContextLength);
- }
-
- while(!this.interruptSearch) {
- int var6;
- char var7;
- try {
- var6 = this.bis.read();
- if (var6 == -1) {
- var7 = '\u0000';
- } else {
- var7 = (char)var6;
- }
- } catch (IOException var27) {
- ((Throwable)var27).printStackTrace();
- this.closeConnection();
- return false;
- }
-
- char var8 = Character.toLowerCase(var7);
- if (!var10) {
- var10 = this.anchorFinder.addChar(var8);
- } else {
- switch (var8) {
- case '\u0000':
- case '\t':
- case '\n':
- case '\r':
- case ' ':
- case '"':
- case '\'':
- case '>':
- if (var17.length() != 0) {
- this.nearestAnchor = var17.toString();
- var10 = false;
- var17.setLength(0);
- }
- break;
- default:
- var17.append(var7);
- }
- }
-
- if (!this.gotTitle) {
- if (!var11) {
- var11 = this.titleFinder.addChar(var8);
- } else if (var8 != '<' && var6 != -1) {
- var18.append(var7);
- } else {
- if (var18.length() != 0) {
- this.title = var18.toString();
- }
-
- var18 = null;
- this.titleFinder = null;
- this.gotTitle = true;
- var11 = false;
- }
- }
-
- if (var8 == '<') {
- var9 = true;
- }
-
- if ((!var3 || !var9) && var15) {
- var31.append(var7);
-
- for(int var22 = 0; var22 < var19 && !var5; ++var22) {
- if (var20[var22].addChar(var8)) {
- if (!var4) {
- var5 = true;
- } else {
- --var19;
- if (var19 == 0) {
- var5 = true;
- } else {
- if (var22 != var19) {
- System.arraycopy(var20, var22 + 1, var20, var22, var19 - var22);
- --var22;
- }
-
- var20[var19] = null;
- }
- }
- }
- }
- }
-
- if (var8 == '>') {
- var9 = false;
- }
-
- if (this.useStopPattern && !var13 && var15) {
- var13 = var12.addChar(var7);
- }
-
- if (this.useStartPattern && !var15) {
- var15 = var14.addChar(var7);
- }
-
- if (var6 == -1 || var5 || var13) {
- if (var6 != -1 && (var5 || var11)) {
- int var32 = 0;
- StringBuffer var23 = null;
- int var24 = -1;
- if (var5) {
- if (var2 && this.trailingContextLength > 0) {
- var24 = this.trailingContextLength - 1;
- } else {
- var24 = this.trailingContextLength;
- }
-
- var23 = new StringBuffer(var31.getSize() + var24);
- var23.append(var31.toString());
- }
-
- while(var11 || var5 && var32 < var24) {
- try {
- var6 = this.bis.read();
- } catch (IOException var26) {
- ((Throwable)var26).printStackTrace();
- var6 = -1;
- }
-
- if (var6 == -1) {
- if (var11 && !this.gotTitle) {
- var11 = false;
- this.gotTitle = true;
- this.title = var18.toString();
- this.titleFinder = null;
- }
- break;
- }
-
- var7 = (char)var6;
- if (var6 == 60) {
- var9 = true;
- if (var11 && !this.gotTitle) {
- var11 = false;
- this.gotTitle = true;
- this.title = var18.toString();
- this.titleFinder = null;
- }
- }
-
- if (var6 == 62 && var9) {
- if (var11 && !this.gotTitle) {
- var18.append(var7);
- }
-
- var9 = false;
- if (var3) {
- continue;
- }
- }
-
- if (var11 && !this.gotTitle) {
- var18.append(var7);
- }
-
- if (var5 && (!var9 || !var3) && var32 < var24) {
- var23.append(var7);
- ++var32;
- }
- }
-
- if (var5) {
- this.contextString = var23.toString();
- this.contextString = SearchToHTML.makeHTMLSafe(this.contextString);
- }
- }
-
- this.closeConnection();
- return var5;
- }
- }
-
- this.closeConnection();
- throw new InterruptedException(this.relativeURL);
- }
- }
- }
-
- public final void interruptSearch() {
- this.interruptSearch = true;
- synchronized(this){}
-
- try {
- this.interruptSearch = false;
- } catch (Throwable var3) {
- throw var3;
- }
-
- }
-
- private boolean openConnection() {
- try {
- URLConnection var1 = this.url.openConnection();
- if (!this.gotDocumentInfo) {
- this.gotDocumentInfo = true;
- Date var2 = new Date(var1.getLastModified());
- int var3 = var2.getYear();
- int var4 = var1.getContentLength();
- StringBuffer var5 = new StringBuffer();
- if (var4 > 1024) {
- var5.append(var4 / 1024);
- var5.append('k');
- } else if (var4 > 0) {
- var5.append(var4);
- var5.append('b');
- }
-
- if (var3 > 71) {
- var5.append(", ");
- var5.append(months[var2.getMonth()]);
- var5.append(' ');
- var5.append(var2.getDate());
- var5.append(", ");
- var5.append(var3 + 1900);
- }
-
- if (var5.length() > 0) {
- this.documentInfo = var5.toString();
- }
- }
-
- this.bis = new BufferedInputStream(var1.getInputStream());
- return true;
- } catch (FileNotFoundException var6) {
- ((Throwable)var6).printStackTrace();
- this.closeConnection();
- this.noHorribleError = false;
- return false;
- } catch (IOException var7) {
- ((Throwable)var7).printStackTrace();
- this.closeConnection();
- return false;
- } catch (SecurityException var8) {
- ((Throwable)var8).printStackTrace();
- this.noHorribleError = false;
- this.closeConnection();
- return false;
- }
- }
-
- private final void closeConnection() {
- try {
- if (this.bis != null) {
- this.bis.close();
- }
- } catch (IOException var6) {
- ((Throwable)var6).printStackTrace();
- } finally {
- this.bis = null;
- }
-
- }
- }
-